package com.zwl.lib_base.base

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import okhttp3.logging.HttpLoggingInterceptor.Level.BODY
import retrofit2.Retrofit
import retrofit2.converter.scalars.ScalarsConverterFactory
import java.util.concurrent.TimeUnit
import javax.inject.Singleton

/**
 * 全局作用域的网络层的依赖注入模块
 *
 * @author Qu Yunshuo
 * @since 6/4/21 8:58 AM
 */
@Module
@InstallIn(SingletonComponent::class)
class DINetworkModule {

    /**
     * [OkHttpClient]依赖提供方法
     *
     * @return OkHttpClient
     */
    @Singleton
    @Provides
    fun provideOkHttpClient(): OkHttpClient {
        // 日志拦截器部分
//        val level = if (BuildConfig.VERSION_TYPE != VersionStatus.RELEASE) BODY else NONE
        val logInterceptor = HttpLoggingInterceptor().setLevel(BODY)

        return OkHttpClient.Builder()// 1.使用内部工厂类 Builder 来设置 OkHttpClient
            .connectTimeout(15L * 1000L, TimeUnit.MILLISECONDS) // 2.这行代码设置了连接超时时间,如果15秒内无法建立连接，则会抛出超时异常。
            .readTimeout(20L * 1000L, TimeUnit.MILLISECONDS)//3. 这行代码设置了读取超时时间,如果20秒内无法完成数据的读取，则会抛出超时异常。
            .addInterceptor(logInterceptor)//4. 拦截器可以在请求发送前后或响应接收前后执行自定义操作，比如打印日志
            .retryOnConnectionFailure(true)//5. 意味着如果网络连接失败，OkHttp会尝试自动重试。
            .build()
    }

    /**
     * 项目主要服务器地址的[Retrofit]依赖提供方法
     *
     * @param okHttpClient OkHttpClient OkHttp客户端
     * @return Retrofit
     */
    @Singleton
    @Provides
    fun provideMainRetrofit(okHttpClient: OkHttpClient): Retrofit {
        return Retrofit.Builder()
            .baseUrl(NetBaseUrlConstant.MAIN_URL)
            .addConverterFactory(ScalarsConverterFactory.create())//这行代码添加了一个转换工厂ScalarsConverterFactory，它用于将HTTP响应体转换为标量类型（如String、Integer等）。
            .client(okHttpClient)//这行代码设置了用于网络请求的OkHttpClient实例。这个okHttpClient应该是在代码的其他地方创建并配置好的，可能包含了一些自定义的设置，比如超时时间、拦截器等。
            .build()
    }
}